package com.alameda.common.commonpent.mp;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Collection;
import java.util.List;

import static com.alameda.common.base.constant.SqlDmlConstant.*;

/**
 * 通用查询接口
 *
 * @param <T> 实体泛型
 * @author Lv
 * @date 2024/2/19
 */
public interface BaseService<T> extends IService<T> {
    /**
     * 精确查询多条数据
     *
     * @param t 实体类型
     * @return
     */
    default List<T> list(T t) {
        return this.list(Wrappers.lambdaQuery(t));
    }

    /**
     * 精确查询一条数据 （存在多条报错）
     *
     * @param t 实体类型
     * @return
     */
    default T getOne(T t) {
        return this.getOne(Wrappers.lambdaQuery(t));
    }

    /**
     * 精确查询一条数据 （存在多条取第一条）
     *
     * @param t 实体类型
     * @return
     */
    default T findOne(T t) {
        return this.getOne(Wrappers.lambdaQuery(t).last(LIMIT_1));
    }

    /**
     * 精确查询数据数量
     *
     * @param t 实体类型
     * @return
     */
    default Long count(T t) {
        return this.count(Wrappers.lambdaQuery(t));
    }

    /**
     * 精确删除数据
     *
     * @param t 实体类型
     * @return
     */
    default Boolean remove(T t) {
        return this.remove(Wrappers.lambdaUpdate(t));
    }

    /**
     * 通过id集合查询数据 倒叙排序
     *
     * @param idList id集合
     * @return
     */
    default List<T> findByIdInOrderByCreateTimeDesc(Collection<?> idList) {
        return this.list(Wrappers.<T>query().in(ID, idList).orderByDesc(CREATE_TIME));
    }

    /**
     * 通过id集合范围排除查询数据 倒叙排序
     *
     * @param idList id集合
     * @return
     */
    default List<T> findByIdNotInOrderByCreateTimeDesc(Collection<?> idList) {
        return this.list(Wrappers.<T>query().notIn(ID, idList).orderByDesc(CREATE_TIME));
    }

    /**
     * 通过id集合查询数据 正叙排序
     *
     * @param idList id集合
     * @return
     */
    default List<T> findByIdInOrderByCreateTimeAsc(Collection<?> idList) {
        return this.list(Wrappers.<T>query().in(ID, idList).orderByAsc(CREATE_TIME));
    }

    /**
     * 通过id集合范围排除查询数据 正叙排序
     *
     * @param idList id集合
     * @return
     */
    default List<T> findByIdNotInOrderByCreateTimeAsc(Collection<?> idList) {
        return this.list(Wrappers.<T>query().notIn(ID, idList).orderByAsc(CREATE_TIME));
    }

    /**
     * 通过id集合查询数据 无序
     *
     * @param idList id集合
     * @return
     */
    default List<T> findByIdIn(Collection<?> idList) {
        return this.list(Wrappers.<T>query().in(ID, idList));
    }

    /**
     * 通过id集合范围排除查询数据 无序
     *
     * @param idList id集合
     * @return
     */
    default List<T> findByIdNotIn(Collection<?> idList) {
        return this.list(Wrappers.<T>query().notIn(ID, idList));
    }

    /**
     * 写入数据
     *
     * @param t 实体类型
     * @return
     */
    default T insert(T t) {
        return this.save(t) ? t : null;
    }

    /**
     * 写入或修改数据
     *
     * @param t 实体类型
     * @return
     */
    default T insertOrUpdate(T t) {
        return this.saveOrUpdate(t) ? t : null;
    }
}
